package main

import (
	"fmt"
	"time"
)

/*
future模式(多个子调用相互之间没有依赖)基本工作原理:
1.使用chan作为函数参数
2.启动goroutine调用函数
3.通过chan传入参数
4.做其他可以进行并行处理的事情
5.通过chan异步获取结果
*/

type query struct {
	sql chan string
	result chan string
}

//执行Query
func execQuery( q query) {
	go func() {
		//获取输入
		sql := <- q.sql

		//访问数据库

		//输出结果通道
		q.result <- "result from " + sql
	}()
}

func main() {
	//初始化Query
	q := query{make(chan string, 1), make(chan string, 1)}
	//执行query
	go execQuery(q)
	//发送参数
	q.sql <- "select * from table"
	//做其他事情
	time.Sleep(time.Second)
	//获取结果
	fmt.Println(<-q.result)
}
